import java.io.Serializable;
import java.util.Random;

public class Deck implements Serializable
{
	private Card talia[];				//tablica 52 kart
	
	public Deck()
	{
		talia = new Card [52];
		for (int i = 0; i < 52; ++i)
		{	
			String wartosc, znak;
			
			do
			{
				wartosc = losuj_wartosc();
				znak = losuj_znak();
			} while (czy_byla(wartosc, znak, false));
			
			try
			{
				talia[i] = new Card(znak, wartosc);
			}
			catch (NumberFormatException nfe)
			{
				System.out.println(nfe.getMessage());
			}
		}
	}
	
	private boolean czy_byla(String wartosc, String znak, boolean czy_4)
	{
		int ile_razy = 0;
		for (int i = 0; i < 52; ++i)
		{
			if (talia[i] == null)
				return false;
			else if (talia[i].pokaz_wartosc().equals(wartosc))
			{
					 if (!czy_4 && talia[i].pokaz_znak().equals(znak))
						 return true;
					 ++ile_razy;
			}
		}
		if (ile_razy == 4)
			return true;
		
		return false;
	}
	
	private String losuj_wartosc()
	{
		String wartosc = "";
		Random losowanie = new Random();
		double wylosowany_znak;
		
		do
		{
			wylosowany_znak = losowanie.nextDouble() * 100;
			
			if (wylosowany_znak <= 900)
				for (int i = 100, j = 2; i < 950; i += 100, ++j)
					if (wylosowany_znak <= (i/13))
					{
						wartosc = Integer.toString(j);
						break;
					}
			else if (wylosowany_znak <= (1000/13))
				wartosc = "J";
			else if (wylosowany_znak <= (1100/13))
				wartosc = "Q";
			else if (wylosowany_znak <= (1200/13))
				wartosc = "K";
			else
				wartosc = "A";
		}while (czy_byla(wartosc, "", true));
		
		return wartosc;
	}
	
	private String losuj_znak()
	{
		Random losowanie = new Random();
		double wylosowany_znak = losowanie.nextDouble() * 100;
		String znak;
								//losowanie znaku karty:
		if (wylosowany_znak <= 25)
			znak = new String("kier");
		else if (wylosowany_znak <= 50)
			znak = new String("pik");
		else if (wylosowany_znak <= 75)
			znak = new String("karo");
		else
			znak = new String("trefl");
		return znak;
	}
	
	public Card zwroc_karte(int index)
	{
		return talia[index];
	}
}